package com.kerwin.interceptors;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.kerwin.entity.returnjson.E;
import com.kerwin.exception.HandlerException;
import com.kerwin.sysmgt.UserService;
import com.kerwin.sysmgt.entity.User;
import com.kerwin.utils.TokenUtil;
import com.kerwin.utils.UserThreadLocal;
import io.jsonwebtoken.Claims;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/*！！为什么我没登陆  然后访问模块！！*/
/*！！没有模块的操作  失败的记录！！*/
/*！！因为在这里拦截，模块都没进去！！*/


/*在这里出bug 怎么让他进入操作日志*/


/*拦截器没生效 应该是没有配置拦截路径*/

/*拦截器是所有方法都会进这个拦截器吗？*/

/*登录过滤器*/
/*实现handlerInterceptor接口*/
/*进容器*/

/*测试前端往后端传数据，先关闭  登录验证 拦截器*/
//@Component

public class LoginInterceptor implements HandlerInterceptor {




    /*我的token头key 放在了 配置文件里，要从配置文件里面拿出来*/

    @Resource
    private UserService userService;


    /*这个方法需要自己敲*/
    /*敲preHandle 他才会出来 重写方法*/
    @Override
   // @Logs(module = "拦截器",operate = "用户登录验证")
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        /*获取头文件里面的 token*/
        String token = request.getHeader(TokenUtil.TOKEN_HEADER);
        /*如果没有长度，就代表没有登录了*/
        if(!StringUtils.hasLength(token)){
            /*抛出未登录异常*/
            int a=1;
            throw new HandlerException(E.NO_LOGIN);
        }
        /*进入这里说明有token，验证token有效性*/
        /*在这里报错了*/
        Claims claims = TokenUtil.parseToken(token);

        if(claims!=null){
                                          /*从身体里 拿出电话号*/
            String phone = (String)claims.get(TokenUtil.TOKEN_PHONE);
            //根据电话号
            System.out.println("电话号 "+phone);
            /*在这里用电话号码 从数据库把用户信息查出来*/

            User user_ = new User();
            user_.setUserPhone(phone);
            QueryWrapper<User> queryWrapper = new QueryWrapper<User>(user_);

            /*数据库里面没有设置 电话号唯一*/
            User user = userService.getOne(queryWrapper);
            /*把用户放到 线程变量里*/
            UserThreadLocal.setUser(user);

            /*这里用电话号  获取新token*/

            String newtToken = TokenUtil.CreatingJws(user.getUserPhone());
            /*这里刷新token*/
            /*刷新原理 用response 把响应头发送过去*/
            /*响应头的key和之前的一样，就覆盖了之前的token 刷新了时间*/
            response.addHeader(TokenUtil.TOKEN_HEADER,newtToken);
        }



        return true;
        /*这个鬼东西 好像永远返回true*/
        /*return HandlerInterceptor.super.preHandle(request, response, handler);*/
    }
}
